package net.lulihu.pangolin.headless.client.handler;

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.handler.timeout.IdleStateHandler;
import lombok.extern.slf4j.Slf4j;
import net.lulihu.pangolin.headless.common.protocol.ProtocolMessage;
import net.lulihu.pangolin.headless.common.protocol.ProtocolMessageType;

/**
 * 心跳程序
 */
@Slf4j
public class HeartbeatCheckHandler extends IdleStateHandler {

    // 写 时间
    private static final int WRITE_IDLE_TIME = 10;

    public HeartbeatCheckHandler() {
        this(0, WRITE_IDLE_TIME, 0);
    }

    /**
     * @param readerIdleTimeSeconds 在指定的时间段内未执行读取时，将触发状态为IdleState.READER_IDLE的IdleStateEvent。 指定0以禁用
     * @param writerIdleTimeSeconds 在指定的时间段内未执行写入时将触发状态为IdleState.WRITER_IDLE的IdleStateEvent。 指定0以禁用
     * @param allIdleTimeSeconds    状态为IdleState.ALL_IDLE的IdleStateEvent将在指定的时间段内未执行读取或写入时触发。 指定0以禁用
     */
    public HeartbeatCheckHandler(int readerIdleTimeSeconds, int writerIdleTimeSeconds, int allIdleTimeSeconds) {
        super(readerIdleTimeSeconds, writerIdleTimeSeconds, allIdleTimeSeconds);
    }

    @Override
    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) {
        if (IdleState.WRITER_IDLE == evt.state()) {
            // 指定时间未写入 发起心跳
            ProtocolMessage message = new ProtocolMessage();
            message.setType(ProtocolMessageType.TYPE_HEARTBEAT);
            ctx.channel().writeAndFlush(message);
        }
    }
}
